"""
《风声》
    1942 年，潜伏在汪伪政权剿匪司令部的地下党员顾晓梦和吴志国遭到日本特 
务机关的调查。顾晓梦为掩护同志撤退，并将日本特务机关设下圈套的信息传递出 
去，选择主动暴露，牺牲自己。
    临死前，借口为姐姐缝补旗袍的机会，在旗袍里子 
上缝制了点和横构成的摩斯电报码（斜杠是分字符），以此为自己的遗言。
    顾晓梦 采用的电码编码本为 code.txt，她留下的内容是 miwen.txt。请使用 python 编程 
的方式，利用 code 文件给 miwen 文件解码。
    由于在严密监视下，因此缝制内容中 （miwen 文件）误缝了非点与横的字符，统计与解码时需要去除这些字符。 
（1）（12 分）统计 miwen.txt 中每种摩斯电报码及相应出现频次，按照出现频次 
从大到小排序，打印电报码及频次（前 20）。 
（2）（12 分）请翻译 miwen 并打印在屏幕上。 
（3）（2 分）按照每种摩斯电报码含有点的个数从多到少，打印摩斯电报码及其 
所对应的明文（前 20）。
"""

import re
import pandas as pd
import numpy as np

# 对密文进行清洗
with open('./miwen.txt','r') as f:
    str_before = f.read()
    str_after = ''.join(re.findall('[\.\-\/]',str_before)) # 只保留 .-/ 三种字符
    print(str_after)
# --.-..--..-./.-...----.../.----...-.../-..--.-.---./..-.--.--.--/--.-..--..-./.----...-.../.---.....---/-...-.--..--/--.-..--..-./-....-.---../.---.....---/-.-..-.-.--./.-...----.../.-..-.--.--./--.-..--..-./.---..----../.-....---..-/--....--.-.-/-..--.-.---./-....-.-...-/--.-..--..-./..--.----.-./...-----...-/-....--..---/-..-----...-/..-----..--./-.-.---...-./.-..--..---./..-..-....../.........-.-/...-..-.--.-/..-.--.--.--/-...-.--..--/.-.-----..--/-...--.--.../---.-...--../-.-..-.-.--./--...---.---/...-......../-..-.--..-../--..-.-.----/..--.-.----./--.-..--..-./--....----../.-..-.--.-../-.-.-..-..../.---.....---/....--.-..--/.--------.--/..-.--.--.--/.---..-..---/--.-..--..-./----.---.--./--.----..-.-/..-.--.--.--/..-.--.--.-./-.-----.-..-/-..-..---..-/---.--.-.--./-.-..----.../-.....--...-/--.-..--..-./.---.....---/..-.--.-.---/--....-....-/-....-.-...-/--.-..--..-./--.-..------/-....-.---../.---.....---/-.-..-.-.--./..-.--.--.--/--.-..--..-./----.-.----./..-.--.--.-./-.-----.-..-/...-....--../--....----../-.....---.-./--....-....-/..-.--.--.--/..-.--.----./.---..----../..-.---.-.--/-.--..-...../-.--...-..../.-.-.--.-..-/-....-------/..--.-...-.-/-....---..../-......-..--/..-.--.--.--/--.-..--..-./-.-----..---/..-.--.----./..---.------/-...-..--.../.-...----.../..-.-.-.-..-/..--.----.-./..-.--.--.--/-.------...-/--.------.--/....-...-..-/---..--.-.../---.--.-...-/-....-.-...-/--.-..--..-./.---.....---/---..--...../-.-.--.-.-../.------...--/..--..--..-./--..---.-.../-.--.-------/..-.--.--.--/..-....-.-../-.----.--.--/-.-----...../..--..--..-./--.-.-...---/..-.--.--.-./-.-----.-..-/..---..-.-../...-----...-/-....-.-...-/-..-.....---/-.-..-.-.--./.-...----.../---.--.-.--./.-....--.-.-/.----..----./..-.--.--.--/.--------.../.-..---..---/--.-.-.-..--/.--------.../..-...-...../.-...----.../-...-.--..--/.-.--..-..../-.-..-.-.--./..-.--.--.--/--....--.-.-/-...-.--..--/---.--.-...-/..-..-.---../..--.-.--.--/.-.-..------/--.-.-.-..--/---.--.-...-/..-..-.---../--.----..-.-/..--.-.---../-....-.-...-/

# 第一题：降序统计频次排名前20的密文
str_list = str_after.split('/')
# print(str_list)
# ['--.-..--..-.', '.-...----...', '.----...-...', '-..--.-.---.', '..-.--.--.--', '--.-..--..-.', '.----...-...', '.---.....---', '-...-.--..--', '--.-..--..-.', '-....-.---..', '.---.....---', '-.-..-.-.--.', '.-...----...', '.-..-.--.--.', '--.-..--..-.', '.---..----..', '.-....---..-', '--....--.-.-', '-..--.-.---.', '-....-.-...-', '--.-..--..-.', '..--.----.-.', '...-----...-', '-....--..---', '-..-----...-', '..-----..--.', '-.-.---...-.', '.-..--..---.', '..-..-......', '.........-.-', '...-..-.--.-', '..-.--.--.--', '-...-.--..--', '.-.-----..--', '-...--.--...', '---.-...--..', '-.-..-.-.--.', '--...---.---', '...-........', '-..-.--..-..', '--..-.-.----', '..--.-.----.', '--.-..--..-.', '--....----..', '.-..-.--.-..', '-.-.-..-....', '.---.....---', '....--.-..--', '.--------.--', '..-.--.--.--', '.---..-..---', '--.-..--..-.', '----.---.--.', '--.----..-.-', '..-.--.--.--', '..-.--.--.-.', '-.-----.-..-', '-..-..---..-', '---.--.-.--.', '-.-..----...', '-.....--...-', '--.-..--..-.', '.---.....---', '..-.--.-.---', '--....-....-', '-....-.-...-', '--.-..--..-.', '--.-..------', '-....-.---..', '.---.....---', '-.-..-.-.--.', '..-.--.--.--', '--.-..--..-.', '----.-.----.', '..-.--.--.-.', '-.-----.-..-', '...-....--..', '--....----..', '-.....---.-.', '--....-....-', '..-.--.--.--', '..-.--.----.', '.---..----..', '..-.---.-.--', '-.--..-.....', '-.--...-....', '.-.-.--.-..-', '-....-------', '..--.-...-.-', '-....---....', '-......-..--', '..-.--.--.--', '--.-..--..-.', '-.-----..---', '..-.--.----.', '..---.------', '-...-..--...', '.-...----...', '..-.-.-.-..-', '..--.----.-.', '..-.--.--.--', '-.------...-', '--.------.--', '....-...-..-', '---..--.-...', '---.--.-...-', '-....-.-...-', '--.-..--..-.', '.---.....---', '---..--.....', '-.-.--.-.-..', '.------...--', '..--..--..-.', '--..---.-...', '-.--.-------', '..-.--.--.--', '..-....-.-..', '-.----.--.--', '-.-----.....', '..--..--..-.', '--.-.-...---', '..-.--.--.-.', '-.-----.-..-', '..---..-.-..', '...-----...-', '-....-.-...-', '-..-.....---', '-.-..-.-.--.', '.-...----...', '---.--.-.--.', '.-....--.-.-', '.----..----.', '..-.--.--.--', '.--------...', '.-..---..---', '--.-.-.-..--', '.--------...', '..-...-.....', '.-...----...', '-...-.--..--', '.-.--..-....', '-.-..-.-.--.', '..-.--.--.--', '--....--.-.-', '-...-.--..--', '---.--.-...-', '..-..-.---..', '..--.-.--.--', '.-.-..------', '--.-.-.-..--', '---.--.-...-', '..-..-.---..', '--.----..-.-', '..--.-.---..', '-....-.-...-', '']
df_miwen_str = pd.DataFrame(str_list)
# print(df_miwen_str)
#                 0
# 0    --.-..--..-.
# 1    .-...----...
# 2    .----...-...
# 3    -..--.-.---.
# 4    ..-.--.--.--
# ..            ...
# 152  ..-..-.---..
# 153  --.----..-.-
# 154  ..--.-.---..
# 155  -....-.-...-
# 156
print(df_miwen_str[0].value_counts().head(20)) 
# --.-..--..-.    12
# ..-.--.--.--    11
# .---.....---     6
# -....-.-...-     5
# -.-..-.-.--.     5
# .-...----...     5
# -...-.--..--     4
# -.-----.-..-     3
# ---.--.-...-     3
# ..-.--.--.-.     3
# ..-..-.---..     2
# --....-....-     2
# --....----..     2
# ..--.----.-.     2
# -....-.---..     2
# --.----..-.-     2
# .--------...     2
# --....--.-.-     2
# --.-.-.-..--     2
# ---.--.-.--.     2

# 第二题：翻译密文
df_code = pd.read_table('./code.txt',encoding='utf-8',header=None)
# print(df_code)
#                    0
# 0     抿 ..-....-.---
# 1     瞌 ---.-..--..-
# 2     途 -.-....-.-.-
# 3     递 ..-.--.-...-
# 4     死 -..--.-.---.
#              ...
# 2812  霍 -.-.------..
# 2813  郎 .--.-.....-.
# 2814  轶 -.......-..-
# 2815  宗 -.---.-----.
# 2816  挫 ----..---...
df_code = df_code.rename(columns={0:'str'}) 
df_code['value'] = df_code['str'].apply(lambda x:x.split(' ')[0])
df_code['key'] = df_code['str'].apply(lambda x:x.split(' ')[1])
# print(df_code)
#                  str value           key
# 0     抿 ..-....-.---     抿  ..-....-.---
# 1     瞌 ---.-..--..-     瞌  ---.-..--..-
# 2     途 -.-....-.-.-     途  -.-....-.-.-
# 3     递 ..-.--.-...-     递  ..-.--.-...-
# 4     死 -..--.-.---.     死  -..--.-.---.
#              ...   ...           ...
# 2812  霍 -.-.------..     霍  -.-.------..
# 2813  郎 .--.-.....-.     郎  .--.-.....-.
# 2814  轶 -.......-..-     轶  -.......-..-
# 2815  宗 -.---.-----.     宗  -.---.-----.
# 2816  挫 ----..---...     挫  ----..---...
df_merge = pd.merge(df_miwen_str, df_code, how='left', left_on=0,right_on='key')
# print(df_merge)
#                 0             str value           key
# 0    --.-..--..-.  我 --.-..--..-.     我  --.-..--..-.
# 1    .-...----...  不 .-...----...     不  .-...----...
# 2    .----...-...  怕 .----...-...     怕  .----...-...
# 3    -..--.-.---.  死 -..--.-.---.     死  -..--.-.---.
# 4    ..-.--.--.--  ， ..-.--.--.--     ，  ..-.--.--.--
# ..            ...             ...   ...           ...
# 152  ..-..-.---..  种 ..-..-.---..     种  ..-..-.---..
# 153  --.----..-.-  信 --.----..-.-     信  --.----..-.-
# 154  ..--.-.---..  仰 ..--.-.---..     仰  ..--.-.---..
# 155  -....-.-...-  。 -....-.-...-     。  -....-.-...-
# 156                           NaN   NaN           NaN
str_text_list = list(df_merge['value'])
# print(str_text_list)
# ['我', '不', '怕', '死', '，', '我', '怕', '的', '是', '我', '爱', '的', '人', '不', '知', '我', '因', '何', '而', '死', '。', '我', '身', '在', '炼', '狱', '留', '下', '这', '份', '记', '录', '，', '是', '希', '望', '家', '人', '和', '玉', '姐', '原', '谅', '我', '此', '刻', '容', '的', '决', '定', '，', '但', '我', '坚', '信', '，', '你', '们', '终', '会', '明', '白', '我', '的', '心', '情', '。', '我', '亲', '爱', '的', '人', '，', '我', '对', '你', '们', '如', '此', '无', '情', '，', '只', '因', '民', '族', '已', '到', '存', '亡', '之', '际', '，', '我', '辈', '只', '能', '奋', '不', '顾', '身', '，', '挽', '救', '于', '万', '一', '。', '我', '的', '肉', '体', '即', '将', '陨', '灭', '，', '灵', '魂', '却', '将', '与', '你', '们', '同', '在', '。', '敌', '人', '不', '会', '了', '解', '，', '老', '鬼', '、', '老', '枪', '不', '是', '个', '人', '，', '而', '是', '一', '种', '精', '神', '、', '一', '种', '信', '仰', '。', nan]
str_text = ''.join([str(i) for i in str_text_list])
print(str_text)
# 我不怕死，我怕的是我爱的人不知我因何而死。我身在炼狱留下这份记录，是希望家人和玉姐原谅我此刻容的决定，但我坚信，你们终会明白我的心情。我亲爱的人，我对你们如此无情，只因民族已到存亡之际，我辈只能奋不顾身，挽救于万一。我的肉体即将陨灭，灵魂却将与你们同在。敌人不会了解，老鬼、老枪不是个人，而是一种精神、一种信仰。nan

# 第三题：降序统计点数排名前20的密文和明文
df_miwen_str = df_miwen_str.rename(columns={0:'str'}) 
df_dot = df_merge
df_dot = df_dot.dropna()
df_dot['dot'] = df_dot['key'].apply(lambda x:x.replace('-',''))
df_dot['length'] = df_dot['dot'].str.len()
df_final = df_dot[['key','value','length']]
df_final = pd.pivot_table(df_final,index=['key','value'],values=['length'],aggfunc=np.sum)
df_final = df_final.sort_values(ascending=False,by='length').head(20)
print(df_final)
#                     length
# key          value        
# --.-..--..-. 我          72
# ..-.--.--.-- ，          55
# -....-.-...- 。          40
# .---.....--- 的          36
# .-...----... 不          35
# -.-..-.-.--. 人          30
# -...-.--..-- 是          24
# ..-.--.--.-. 你          18
# --....-....- 情          16
# ---.--.-...- 一          15
# ..--..--..-. 将          14
# -....-.---.. 爱          14
# .----...-... 怕          14
# ..-..-.---.. 种          14
# --....--.-.- 而          12
# --....----.. 此          12
# -.-----.-..- 们          12
# ...-----...- 在          12
# ...-........ 玉          11